package com.zbkj.client.service;

import com.zbkj.common.model.client.agent.UserLocation;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

/**
 * 代理客户端服务接口
 * 用于处理与外部AI代理的通信
 */
public interface AgentClientService {

    /**
     * 用户位置代理API
     * 发送消息到位置相关的AI代理服务
     * 
     * @param message 用户消息
     * @return 代理响应结果
     */
    Map<String , Object> userLocationAgentApi(String message);

    /**
     * 请求agent将返回的数据写入到用户定位表中
     * @param desc
     * @param message
     * @param userId
     * @param merId
     * @return
     */
    UserLocation insertUserLocation(String desc, String message, Integer userId, Integer merId);


    /**
     * 写入子账号的定位信息
     * @param id
     * @param userId
     * @return
     */
    UserLocation insertSubUserLocation(Integer id, Integer userId);


    /**
     * 周任务API
     * 发送消息到周任务的AI代理服务
     *
     * @param message 用户消息
     * @return 代理响应结果
     */
    Map<String , Object> weekTaskAgentApi(String message);

    /**
     * 请求agent将返回的数据写入到周任务表中
     * @param message 用户消息
     * @param userId 用户ID
     * @param merId 商户ID
     * @return 插入的记录ID列表
     */
    List<Integer> insertWeekTask(String message, Integer userId, Integer merId);

    /**
     * 根据当前日期返回这周周一的日期和周日的日期
     * @return Map包含monday和sunday两个key，值为yyyy-MM-dd格式的日期字符串
     */
    Map<String, String> getCurrentWeekDates();

    /**
     * 创建话题API
     * 发送消息到话题创建的AI代理服务
     *
     * @param message 用户消息
     * @return 代理响应结果
     */
    Map<String, Object> createTopicApi(String message,  Integer isMarketing, Map<String, Object> agentUserInfo);

    /**
     * 创建话题并保存到数据库
     * @param userId 用户ID
     * @param merId 商户ID
     * @return 插入的记录ID列表
     */
    List<Integer> createTopic(Integer userId, Integer merId, Map<String, Object> agentUserInfo);

    /**
     * 流式聊天API
     * 发送消息到指定的AI代理服务并返回流式响应
     *
     * @param agentId AI代理ID
     * @param message 用户消息
     * @param sessionId SSE会话ID
     * @param agentUserInfo 代理用户信息
     * @param response HTTP响应对象
     * @param method 数据库插入方法名（可选）
     * @param params 数据库插入参数（可选）
     * @param agentSessionId 发送给agent的session_id（可选）
     */
    void chatStream(String agentId, String message, String sessionId, Map<String, Object> agentUserInfo, HttpServletResponse response, String method, Map<String, Object> params, String agentSessionId);

    /**
     * 获取代理用户信息
     * 根据用户位置信息构建代理服务所需的用户信息参数
     *
     * @param userLocation 用户位置信息
     * @return 代理服务用户信息参数
     */
    Map<String, Object> getAgentUserInfo(UserLocation userLocation);

    /**
     * 根据时长计算需要扣除的点数
     * @param module 模块名称
     * @param duration 时长（秒）
     * @return 扣点值
     */
    Double getPointByDuration(String module, Integer duration);

    /**
     * 根据module返回对应的名字
     * @param module
     * @return
     */
    String getMouleName(String module);

} 